#include <stdio.h>
#include <stdlib.h>
#include "flit.h"

flit_t *flit_free_list; 

flit_t *flit_alloc(void)
{
  flit_t *flit_ptr;
  if(flit_free_list == NULL)
  {
    printf("free list is empty\n"); 
    return NULL;
  } 
  
  flit_ptr       = flit_free_list; 
  flit_free_list = flit_free_list->next; 

  flit_ptr->next = NULL;  
  return flit_ptr; 
}

void flit_free(flit_t **flit_ptr) 
{
  (*flit_ptr)->next  = flit_free_list; 
  flit_free_list     = *flit_ptr; 
  *flit_ptr          = NULL;  
}

void init_flit_pool(void)
{ 
  flit_t *flit_pool;

  flit_pool = (flit_t *)calloc(FLIT_POOL_SZ, sizeof(flit_t)); 
  if(flit_pool == NULL) 
  { 
    perror("init_flit_pool"); 
    exit(1); 
  } 
  else 
  {
    flit_free_list = flit_pool;
    for(int i = 0;i < (FLIT_POOL_SZ - 1);i ++)
      flit_pool[i].next = (flit_pool + i + 1); 
    flit_pool[FLIT_POOL_SZ - 1].next = NULL;
  } 
}
